11. 理解预训练
可以把整个预训练过程理解成:教一个学生玩无限规模的“词语接龙”游戏。
一句话理解预训练
预训练其实只干一件事:
给你前面的内容,你猜下一个字(Token)是什么。
例如:
人工智能是计算机科学的一个
让模型猜:
分
然后继续:
人工智能是计算机科学的一个分
猜:
支
再继续:
人工智能是计算机科学的一个分支
猜:
。
这就是 LLM 最核心的训练目标:
Next Token Prediction(预测下一个 Token)
为什么只玩接龙就能学会知识?
很多人第一次学都会困惑:
只猜下一个字,为什么最后会懂数学、代码、历史?
因为训练数据太大了。
假设模型读过:
北京是中国的首都
很多次。
那么:
北京是中国的
后面最可能是什么?
模型发现:
首都
出现概率极高。
于是参数被调整。
再比如:
1+1=
后面经常是:
2
于是模型学会:
P(2 | 1+1=) 很大
再比如:
苹果公司的创始人是
后面经常接:
乔布斯
于是模型记住了这个知识。
所以:
世界知识 = 海量接龙过程中统计出来的规律
并不是有人把知识库塞进去。
为什么叫自回归(Autoregressive)
比如一句话:
我 爱 学 习 AI
模型训练时实际上在做:
任务1:
输入:我
输出:爱
任务2:
输入:我 爱
输出:学
任务3:
输入:我 爱 学
输出:习
任务4:
输入:我 爱 学 习
输出:AI
一句话被拆成很多很多个接龙任务。
所以:
整句话概率 = 每一步接龙概率的乘积
这就是公式:
本质上就是:
整篇文章 = 一连串接龙
Loss 到底在干什么?
模型猜完以后,要知道:
猜得好不好?
这时候就需要 Loss。
假设词表里有三个词:
苹果
香蕉
西瓜
真实答案是:
苹果
模型第一次预测:
苹果 0.9
香蕉 0.05
西瓜 0.05
这说明:
模型很有把握
Loss 很小。
如果预测:
苹果 0.01
香蕉 0.8
西瓜 0.19
说明:
模型完全猜错
Loss 很大。
所以:
Loss 就是“扣分器”
猜得越准:
Loss 越小
猜得越离谱:
Loss 越大
为什么是 -log(P)?
公式:
看几个例子:
| 正确答案概率P | Loss |
|---|---|
| 1.0 | 0 |
| 0.9 | 0.046 |
| 0.5 | 0.3 |
| 0.1 | 1 |
| 0.01 | 2 |
发现:
猜得越准
P ↑
Loss ↓
猜错时
Loss增长特别快
例如:
0.1 → 1
0.01 → 2
这样模型会被狠狠惩罚。
所以交叉熵非常适合分类任务。
反向传播到底在干什么?
训练时:
预测
↓
计算Loss
↓
反向传播
↓
更新参数
例如:
模型预测:
香蕉
真实答案:
苹果
Loss 很大。
反向传播会告诉模型:
你刚才哪些神经元导致了错误?
然后把这些参数微调一点。
例如:
W = 0.5
更新后:
W = 0.5001
每次只改一点点。
但训练几千亿次后:
模型越来越准
学习率是什么?
可以理解成:
每次改作业改多少
如果学习率太大:
答案在10
你从0跳到20
又跳到5
又跳到30
来回乱飞。
训练崩掉。
如果学习率太小:
0
0.0001
0.0002
0.0003
训练特别慢。
所以需要一个合适的学习率。
Warmup 为什么有必要?
刚开始训练时:
模型参数完全随机
这时候梯度特别不稳定。
如果直接大学习率:
第一步就把参数干飞
Loss 直接爆炸。
于是前几百步:
学习率从0慢慢涨
例如:
0
→ 1e-6
→ 2e-6
→ 3e-6
→ ...
→ 1e-4
这就是 Warmup。
本质:
先热车,再踩油门
余弦退火是什么?
训练后期需要越来越谨慎。
类似考试改作文:
刚开始:
大胆修改
后面:
微调细节
学习率曲线:
/\
/ \
/ \
/ \
__/ \____
先升:
Warmup
再缓慢下降:
Cosine Decay
作用:
前期学得快。
后期学得稳。
AMP 混合精度是什么?
可以理解成:
用更省空间的数字做计算
原来:
FP32
占:
32位
现在:
BF16
只需要:
16位
好处:
显存减半
例如:
24GB
→
能装更多数据
GPU更快
因为 3090、A100、H100 都有专门硬件。
训练速度明显提升。
所以现代大模型训练几乎都在用:
BF16
梯度裁剪是什么?
可以理解成:
给梯度加保险丝
正常情况:
梯度 = 0.5
更新:
参数 -= 学习率 × 0.5
很正常。
某个异常 Batch:
梯度 = 50000
这时:
参数直接飞掉
训练崩溃。
于是:
clip_grad_norm_(..., 1.0)
意思:
超过1.0
就压回1.0
像限速器一样。
输入和标签为什么错开一位?
原句:
A B C D E
训练时:
输入:
A B C D
标签:
B C D E
对应关系:
| 输入 | 目标 |
|---|---|
| A | B |
| A B | C |
| A B C | D |
| A B C D | E |
这样才能训练:
根据前文预测后文
PPL(困惑度)是什么?
公式:
可以简单理解:
模型平均有多少种选择拿不准
例如:
PPL = 2
表示:
平均只在2个词之间犹豫
很厉害。
PPL = 100
表示:
平均在100个词之间乱猜
很差。
所以:
Loss ↓
PPL ↓
模型 ↑
整个预训练流程其实就五步
① 输入一句话
② 做接龙预测
③ 算Loss(扣分)
④ 反向传播(找错误原因)
⑤ 更新参数
然后重复:
几十万步
几百万步
几千万步
最终得到一个:
会续写
会语言理解
会代码
会数学
会常识
的大模型。
但此时它本质上仍然只是一个超级接龙机。
所以预训练结束后,还需要:
SFT(监督微调)
↓
RLHF/RLAIF
↓
ChatGPT式助手
把“会续写文章”训练成“会对话回答问题”。